#ifndef _KEY_MANAGER_H_
#define _KEY_MANAGER_H_

#include "./SYSTEM/sys/sys.h"
#include "./BSP/KEY/cot_key.h"

/* -------------------------------------------- 按键引脚定义 -------------------------------------------- */

#define KEY0_GPIO_PORT              GPIOE
#define KEY0_GPIO_PIN               GPIO_PIN_2
#define KEY0_GPIO_CLK_ENABLE()      do{ __HAL_RCC_GPIOE_CLK_ENABLE(); }while(0)         /* PE口时钟使能 */

#define KEY1_GPIO_PORT              GPIOE
#define KEY1_GPIO_PIN               GPIO_PIN_4
#define KEY1_GPIO_CLK_ENABLE()      do{ __HAL_RCC_GPIOE_CLK_ENABLE(); }while(0)         /* PE口时钟使能 */

#define KEY2_GPIO_PORT              GPIOE
#define KEY2_GPIO_PIN               GPIO_PIN_3
#define KEY2_GPIO_CLK_ENABLE()      do{ __HAL_RCC_GPIOE_CLK_ENABLE(); }while(0)         /* PE口时钟使能 */

/* -------------------------------------------- 按键状态定义 -------------------------------------------- */

/* 按键位码定义 */
#define KEY_CODE_0                  (1 << 0)    /* 按键0的位码 */
#define KEY_CODE_1                  (1 << 1)    /* 按键1的位码 */
#define KEY_CODE_2                  (1 << 2)    /* 按键2的位码 */

/* 按键GPIO读取宏定义 */
#define GPIO_GET_KEY0()             !HAL_GPIO_ReadPin(KEY0_GPIO_PORT, KEY0_GPIO_PIN)    /* 读取KEY0状态 */
#define GPIO_GET_KEY1()             !HAL_GPIO_ReadPin(KEY1_GPIO_PORT, KEY1_GPIO_PIN)    /* 读取KEY1状态 */
#define GPIO_GET_KEY2()             !HAL_GPIO_ReadPin(KEY2_GPIO_PORT, KEY2_GPIO_PIN)    /* 读取KEY2状态 */

/* 组合扫描码生成 */
#define GPIO_GetKEY()               (GPIO_GET_KEY0() << 0 | (GPIO_GET_KEY1() << 1) | (GPIO_GET_KEY2() << 2))

/* -------------------------------------------- 按键ID定义 -------------------------------------------- */

typedef enum
{
    KEY0 = 0,       /* 按键0 */
    KEY1,           /* 按键1 */
    KEY2,           /* 按键2 */

    KEY_MAX_NUM     /* 按键总数 */
} KEY_ID;

/* -------------------------------------------- 函数声明 ---------------------------------------------- */

void FML_KEY_Init(void);

#endif
